跳到主要内容

Github Actions 搭配阿里云镜像

GitHub Actions 怎么使用

注意默认分支不要写错了,不然不会触发,以及项目的 Settings 里面的 Actions 选项卡要开启(以及勾选权限)

纯粹 Docker 部署的方式

name: Go Service CI/CD # 这是工作流程的名称,可以根据需要进行更改。

on:
push: # 此配置指定了在代码推送到仓库时触发工作流程。
branches:
- main # 该配置项表示只有当推送发生在 main 分支时才会触发工作流程。你可以根据需要修改为其他分支。

jobs:
build: # 这定义了一个名为 build 的作业,在工作流程中执行构建和部署操作。
runs-on: ubuntu-latest # 这指定了作业运行的操作系统环境
# 环境选择可以参考 https://docs.github.com/zh/actions/using-github-hosted-runners/about-github-hosted-runners

# 可以在 GitHub Marketplace 上找到大量的 GitHub Actions,其中包括各种预定义操作和工作流程模板。
# https://github.com/marketplace?type=actions
steps:
# https://github.com/marketplace/actions/checkout
# 将代码仓库检出到工作目录中
- name: Checkout repository
uses: actions/checkout@v2

# https://github.com/marketplace/actions/setup-go-environment
# 用于设置 Go 环境
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: 1.20.4

- name: Build Go service
run: go build -o app .

# 加上这个以应对多平台的支持
# https://github.com/docker/setup-qemu-action
- name: Set up QEMU
uses: docker/setup-qemu-action@v2

# 这是一个预定义操作,用于设置 Docker 环境。
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2

# 因为使用的是阿里云的镜像仓库,所以需要先登录。
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
registry: registry.cn-hangzhou.aliyuncs.com
username: ${{ secrets.ALIYUN_USERNAME }}
password: ${{ secrets.ALIYUN_PASSWORD }}

- name: Build Docker image
run: docker build -t qjwwy.com/qjwwy-monitor:${{ github.sha }} .

- name: Push Docker image
env:
run: docker push qjwwy.com/qjwwy-monitor:${{ github.sha }}

- name: Deploy to server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USERNAME }}
password: ${{ secrets.SERVER_PASSWORD }}
script: |
docker stop qjwwy-monitor || true
docker rm qjwwy-monitor || true
docker pull qjwwy.com/qjwwy-monitor:${{ github.sha }}
docker run -d --name qjwwy-monitor -p 8080:8080 qjwwy.com/qjwwy-monitor:${{ github.sha }}

使用 Kubernetes 部署的方式

这里是本地集群,注意需要修改 ~/.bashrc 文件,加上 export KUBECONFIG=~/.kube/config 变量(默认使用的是 bash 终端)

name: Go Service CI/CD # 这是工作流程的名称,可以根据需要进行更改。

on:
push: # 此配置指定了在代码推送到仓库时触发工作流程。
branches:
- master # 该配置项表示只有当推送发生在 main 分支时才会触发工作流程。你可以根据需要修改为其他分支。

jobs:
build: # 这定义了一个名为 build 的作业,在工作流程中执行构建和部署操作。
runs-on: ubuntu-latest # 这指定了作业运行的操作系统环境
# 环境选择可以参考 https://docs.github.com/zh/actions/using-github-hosted-runners/about-github-hosted-runners

# 可以在 GitHub Marketplace 上找到大量的 GitHub Actions,其中包括各种预定义操作和工作流程模板。
# https://github.com/marketplace?type=actions
steps:
# https://github.com/marketplace/actions/checkout
# 将代码仓库检出到工作目录中
- name: Checkout repository
uses: actions/checkout@v2

- name: Set outputs
id: vars
run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT

# 设置 SSH 私钥,用于连接到本地服务器
- name: Set up SSH
uses: webfactory/ssh-agent@v0.5.3
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}

# 加上这个以应对多平台的支持
# https://github.com/docker/setup-qemu-action
- name: Set up QEMU
uses: docker/setup-qemu-action@v2

# 这是一个预定义操作,用于设置 Docker 环境。
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2

# 因为使用的是阿里云的镜像仓库,所以需要先登录。
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
registry: registry.cn-hangzhou.aliyuncs.com
username: ${{ secrets.ALIYUN_USERNAME }}
password: ${{ secrets.ALIYUN_PASSWORD }}

- name: Build Docker image
id: build
# 写入输出的语法格式 echo "{name}={value}" >> $GITHUB_OUTPUT
run: |
docker build -t registry.cn-hangzhou.aliyuncs.com/self-service/qjwwy-monitor:v1-${{ steps.vars.outputs.sha_short }} .
echo "image=registry.cn-hangzhou.aliyuncs.com/self-service/qjwwy-monitor:v1-${{ steps.vars.outputs.sha_short }}" >> $GITHUB_OUTPUT""

- name: Push Docker image
run: |
docker push registry.cn-hangzhou.aliyuncs.com/self-service/qjwwy-monitor:v1-${{ steps.vars.outputs.sha_short }}

- name: Transfer deployment.yaml to local machine
run: |
scp -o StrictHostKeyChecking=no -P ${{secrets.LOCAL_SERVICE_PORT}} -B deployment.yaml ${{ secrets.SSH_USERNAME }}@${{ secrets.K8S_SERVICE_ADDR }}:/home/alsritter/project/stk3s/my-app/deployment.yaml

- name: Connect to Local Service and Deploy to Kubernetes
# 参考 https://cloud.tencent.com/developer/article/1930159
run: |
ssh -o StrictHostKeyChecking=no -p ${{secrets.LOCAL_SERVICE_PORT}} ${{ secrets.SSH_USERNAME }}@${{ secrets.K8S_SERVICE_ADDR }} "export SERVICE_IMAGE_PATH=${{ steps.build.outputs.image }} && envsubst < /home/alsritter/project/stk3s/my-app/deployment.yaml | kubectl apply --kubeconfig=/home/alsritter/.kube/config -f -"

注意 alpine:latest 镜像使用 Go 的服务时可以会出现下面的报错

No such file or directory

需要加上 CGO_ENABLED=0

# 基于 golang 镜像构建
FROM golang:1.20 AS builder

# 设置工作目录
WORKDIR /app

# 拷贝 Go 服务源代码到容器中
COPY main.go go.mod go.sum /app/

# 构建可执行文件
RUN CGO_ENABLED=0 GOOS=linux go build -o app .

# 创建最终的镜像
FROM alpine:latest
# FROM debian:stable-slim

# 设置工作目录
WORKDIR /app

# 拷贝可执行文件和配置文件到容器中
COPY --from=builder /app/app /app/

# 运行服务
CMD ["./app"]

References